#ifndef LIST_H
#define LIST_H
#include "Object.h"
#include "Type.h"
typedef struct Object Object;

typedef struct List{
	OBJECT_HEAD
	//list为顺序表方式实现，且开始最大容量为20，此后每次翻倍。
	int max;
	Object** elements;
	int size;
}List;

//List的方法
void list_init(List*);
List* list_allocate_const();
List* list_allocate();
void list_destroy(List*);

Object* list_allocate_instance(Object*);

void list_append(List*, Object*);
void list_remove(List* self, int index);
void list_insert(List*, int, Object*);
void list_reverse(List*);
void list_expend(List*);
int list_index(List*,Object*);
void list_setitem(List* self, int index, Object* val); // setitem
Object* list_get(List*, int);

						

//实现栈操作
void list_push(List*, Object*);
Object* list_pop(List*);
Object* list_top(List*);

//虚函数实现
void list_print(Object* self);
Object* list_add(Object* self, Object* other);


//@pvm_list_api
Object* pvm_list_init(List* args_list);
Object* pvm_list_append(List* args_list);
Object* pvm_list_pop(List* args_list);
Object* pvm_list_remove(List* args_list);
Object* pvm_list_insert(List* args_list);
Object* pvm_list_reverse(List* args_list);
Object* pvm_list_getitem(List* args_list);
Object* pvm_list_setitem(List* args_list);
Object* pvm_list_index(List* args_list);


extern Type ListType;

/*@pvm启动时需要初始化list
* 该函数将list的方法在虚拟机启动时全都装填进ListType
pvm__init_list
*/

void pvm_init_list();



#endif